package ooday01;

public class LiLun {
    public static void main(String[] args) {
        /*
        理解面向对象编程思想
        掌握面向对象三大特征：
        1.封装、2.继承、3.多态
         */
        /*
        面向过程和面向对象
            面向过程：
                1.以方法为单位来解决问题的编程方式
                2.适合简单的业务
            面向对象：
                1.以对象为单位来解决问题的编程方式
                2.适合复杂的业务
         */
        /*
        OO、OOA、OOD、OOP
            OO(Object-Oriented)：面向对象
            OOA(Object-Oriented-Analysis)：面向对象分析
            OOD(Object-Oriented-Design)：面向对象设计
            OOP(Object-Oriented-Programming)：面向对象编程
         */
        /*
        高质量代码要素：
            要求：
                复用性好、扩展性好、维护性好、移植性好、健壮性好、可读性好、性能好
         */

        /*
        类和对象
            现实生活是由很多很多对象组成，基于对象抽出了类
            对象：软件中真实存在的单个的个体/东西
            类：类型/类别，代表一类个体
                变量和方法组成的一种新的数据类型----引用类型
                 类中可以包含：
                    -对象的属性/特征/数据，设计为成员变量
                    -对象的行为/动作/功能，设计为方法
                 一个类可以创建多个对象
                class 类名{//自己创造的数据类型
                    成员变量类型 变量名;
                    修饰词 返回值类型 方法名称([参数列表]){
                        方法体
                    }
                }
            创建对象的过程称为实例化  语法： new 类名();
        引用类型变量：
            为了能够对实例化的对象进行访问控制，需要使用一个特殊的变量——引用
                数据类型   引用类型变量/引用   指向      对象
                Student       stu          =   new Student();
                句意：声明了Student类型的引用stu，只想了一个学生对象
        访问对象的成员变量、调用方法
            通过引用名打点来访问对象的成员变量或调用方法
        默认值：
        引用类型-------------------null
         */

        /*
        this的作用
            只能用在方法中，方法中访问成员变量之前默认都有this
            this指代当前对象，哪个对象调用方法，this指的就是哪个对象
        this的用法
            this.成员变量名 ------------访问成员变量
            this.方法名() -------------调用方法（很少用）
            this() -------------------调用构造方法
                class Student{
                        String name;
                        int age;
                        String className;
                        String stuId;
                        Student(){
                            this("无名氏",1,"未知","未知");//调用四个参的构造方法
                        }
                        Student(String name,int age,String className,String stuId){
                        this,name = name;
                        this.age = age;
                        this.className = className;
                        this.stuId = stuId;
                        }
                 }
         */

        /*
        构造方法：构造函数、构造器、构建器
            作用：给成员变量赋初始值
            语法：与类同名，没有返回值类型(连void都没有)
            class Student{
                String name;
                int age;
                String className;
                String stuld;
                Student(String name1,int age1,String className1,String stuld1){
                    this.name = name1;
                    this.age = age1;
                    this.className = className1;
                    this.stuld = stuld1;
                }
                void study(){
                    System.out.println(this.name+"在学习");
                }
            }
            调用：在创建(new)对象时自动调用
            Student zs = new Student("张光",25,"jsd2202","001");//调用Student的构造方法
            Student ll = new Student("李林",24,"jsd2202","002");

            续：
                若自己不写构造方法，则编译器默认提供一个无参构造方法。
                若自己写了构造方法，则不在默认提供。
                构造方法可以重载。
                成员变量和局部变量是可以同名的，使用的时候u默认采取的是就近原则，此时若想访问成员变量，则this不能省略
                    class Student{
                        String name;        //成员变量（整个类）
                        int age;            //成员变量（整个类）
                        String className;   //成员变量（整个类）
                        String stuId;       //成员变量（整个类）
                        Student(String name,int age,String className,String stuId){//局部变量（当前方法）
                        //成员变量    局部变量
                        this,name = name;
                        this.age = age;
                        this.className = className;
                        this.stuId = stuId;
                        ......
                        }
                        void study(){
                            System.out.println(name+"在学习");
                        }
         */

        /*
        补充：
            内存管理：由JVM来管理的-------------了解即可
                -堆：new出来的对象（包括实例（成员）变量、数组的元素、方法的地址）
                -栈：局部变量（包括方法的参数）
                -方法区：.class字节码文件（包括所有的方法、静态变量）
            1)用到哪个类，就会将那个类的.class加载到方法区中
            2)调用方法时，方法就会入栈，方法执行完后，方法就会出栈
            3)new出来的对象存储在堆中，引用里面装的是对象的地址
         */
    }

}














